<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // var        ES5
    // let const  ES6新增声明变量的方式


    // var let const 的共同点和区别?
    // 共同点: 都可以声明局部变量和全局变量

    // 区别:
    // (1) 关于变量提示 var声明的变量有变量提升, let和const声明变量没有变量提升
    // (2) 关于重复声明 var声明的变量可以重复声明, let和const声明变量不能重复声明(同一个作用域)
    // (3) 关于重新赋值 var 和 let声明的变量可以重新赋值, const声明的常数变量(常量),一经赋值无法修改(无法修改变量中存储的值)
    // (4) ES6新增块级作用域, 块级作用域中 let和const声明的变量是局部的, 块级作用域对var没有影响

    /* var a = 10;
    let b = 20;
    const c = 30;
    console.log(a, b, c);


    function fn() {
        var a = 100;
        let b = 200;
        const c = 300;
        console.log(a, b, c);
    }
    fn();
    console.log(a, b, c);*/



    /* 关于变量提示 */
   /*  console.log(a);
    // console.log(b);  // 报错:  Cannot access 'b' before initialization (初始化前无法访问“b”)
    console.log(c);  // 报错:  Cannot access 'c' before initialization (初始化前无法访问“c”)

    var a = 10;
    let b = 20;
    const c = 30;
    console.log(a, b, c); */


    // 关于重复声明
    // var a = 10;
    // var a = 100;
    // console.log(a);

    // 报错: Identifier 'b' has already been declared (标识符“b”已声明)
    // let b = 20;
    // let b = 200;
    // console.log(b);
    
    // 报错: Identifier 'c' has already been declared (标识符“c”已声明)
    // const c = 30;
    // const c = 300;


    // 关于重新赋值
    // var a = 10;
    //     a = 100;
    // console.log(a);

    // let b = 20;
    //     b = 200;
    // console.log(b);

    // const c = 30;
    //     c = 300;  // 报错:  Assignment to constant variable. (给常量赋值)
    // console.log(c);

    // 拓展
    // const obj = {};
    // obj.x = 10;
    // obj.y = 20;
    // console.log(obj);

 

</script>

</html>